﻿using Furion.DependencyInjection;
using Furion.FriendlyException;
using Furion.InstantMessaging;
using Newtonsoft.Json;
using System.Reflection;
using static SKIT.FlurlHttpClient.Wechat.Api.Models.CgibinTagsMembersGetBlackListResponse.Types;
namespace EMC.VISITOR.Application;
/// <summary>
/// 工程監工日誌打印服务
/// </summary>
[ApiDescriptionSettings(ApplicationConst.GroupName, Order = 100)]
public partial class FlowSystemSGJKService : IDynamicApiController, ITransient
{
    protected readonly SqlSugarRepository<FlowSystemSGJK> _rep;
    protected readonly SqlSugarRepository<SysDictType> _repDType;
    protected readonly string carOutHost = App.GetConfig<string>("CarOutHost");
    public FlowSystemSGJKService(SqlSugarRepository<FlowSystemSGJK> rep, SqlSugarRepository<SysDictType> repDType)
    {
        _rep = rep;
        _repDType = repDType;
    }
    #region 代码生成
    /// <summary>
    /// 分页查询工程監工日誌打印
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "Page")]
    public virtual async Task<SqlSugarPagedList<FlowSystemSGJKOutput>> Page(FlowSystemSGJKInput input)
    {
        var context = _rep.AsQueryable().FilterDelete();
        if (context.UseCustomeSelectFlag())
        {
            return await context.CustomToSelect<FlowSystemSGJK, FlowSystemSGJKOutput>(input);
        }
        else
        {


            var query = context.CustomWhere(input)
                .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u =>
                    u.project_name.Contains(input.SearchKey.Trim())
                    || u.supplier_name.Contains(input.SearchKey.Trim())
                    || u.personlist.Contains(input.SearchKey.Trim())
                )
                .WhereIF(!string.IsNullOrWhiteSpace(input.project_name), u => u.project_name.Contains(input.project_name.Trim()))
                .WhereIF(!string.IsNullOrWhiteSpace(input.supplier_name), u => u.supplier_name.Contains(input.supplier_name.Trim()))
                .WhereIF(!string.IsNullOrWhiteSpace(input.personlist), u => u.personlist.Contains(input.personlist.Trim()))
                .Select<FlowSystemSGJKOutput>().OrderByIF(input.Field.IsNullOrEmpty() && typeof(FlowSystemSGJK).GetProperties().Any(pp => pp.Name == nameof(FlowSystemSGJK.CreateTime) && (pp.GetCustomAttribute<SugarColumn>() == null || pp.GetCustomAttribute<SugarColumn>().IsIgnore == false)), u => u.CreateTime, OrderByType.Desc)
    ;
            if (input.BeginDateTimeRange != null && input.BeginDateTimeRange.Count > 0)
            {
                DateTime? start = input.BeginDateTimeRange[0];
                query = query.WhereIF(start.HasValue, u => u.BeginDateTime > start);
                if (input.BeginDateTimeRange.Count > 1 && input.BeginDateTimeRange[1].HasValue)
                {
                    var end = input.BeginDateTimeRange[1].Value.AddDays(1);
                    query = query.Where(u => u.BeginDateTime < end);
                }
            }
            if (input.EndDateTimeRange != null && input.EndDateTimeRange.Count > 0)
            {
                DateTime? start = input.EndDateTimeRange[0];
                query = query.WhereIF(start.HasValue, u => u.EndDateTime > start);
                if (input.EndDateTimeRange.Count > 1 && input.EndDateTimeRange[1].HasValue)
                {
                    var end = input.EndDateTimeRange[1].Value.AddDays(1);
                    query = query.Where(u => u.EndDateTime < end);
                }
            }
            query = query.CustomeOrder(input, "");
            var data = await query.CustomToPagedListAsync(input);
            foreach (var item in data.Items)
            {
                item.Images = GetDocImg(item.Images);
            }

            return data;
        }
    }
    class DocImgModel
    {
        public string name { get; set; }
        public string url { get; set; }

        public DateTime? time { get; set; }
    }
    private string GetDocImg(string docImg)
    {
        //if (docImg.IsNullOrEmpty()) return default(string);
        //if (currentHost.IsNullOrEmpty()) return docImg;
        //var ipPorts = CommonUtil.ExtractIPAndPort(docImg);

        //docImg = docImg.Replace("scm.emcks.com","172.16.10.200");
        //if (ipPorts.Count <= 0)
        //    return docImg;
        //return docImg.Replace(ipPorts[0], currentHost);

        if (docImg.IsNullOrEmpty()) return default(string);
        if (carOutHost.IsNullOrEmpty()) return docImg;

        List<DocImgModel> list = new List<DocImgModel>();
        var images = JsonConvert.DeserializeObject<List<DocImgModel>>(docImg);
        foreach (DocImgModel img in images)
        {
            if (img.url.Contains("blob")) continue;
            DocImgModel imgTemp = new DocImgModel();
            var uri = new Uri(img.url);
            imgTemp.url = $"{uri.Scheme}://{carOutHost}{uri.AbsolutePath}";
            imgTemp.name = img.name;
            list.Add(imgTemp);
        }
        return list.ToJson();
    }
    /// <summary>
    /// 增加工程監工日誌打印
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "Add")]
    public virtual async Task<JRResult<string>> Add(AddFlowSystemSGJKInput input)
    {
        var entity = input.Adapt<FlowSystemSGJK>();
        var doSomeResult = await entity.DoSomeThing(_rep.Context);
        if (!doSomeResult.Item1)
            return CustomeResult.Fail<string>(doSomeResult.Item2);
        bool isNeedReplicatings = false;
        string repString = null;
        Expression<Func<FlowSystemSGJK, bool>> whereExpression = r => true;
        if (isNeedReplicatings)
        {
            isNeedReplicatings = await _rep.IsAnyAsync(whereExpression);
            if (!isNeedReplicatings)
            {
                await _rep.InsertAsync(entity);
            }
            else
            {
                //系统中存在已删除数据，还原数据
                whereExpression = whereExpression.And(r => r.IsDelete == true);
                var exsitModel = await _rep.GetFirstAsync(whereExpression);
                if (exsitModel != null)
                {
                    entity.Id = exsitModel.Id; //还原已删除的数据
                    entity.IsDelete = false;
                    await _rep.UpdateAsync(entity);
                    isNeedReplicatings = false;
                }
            }
        }
        else
        {
            await _rep.InsertAsync(entity);
        }
        return new JRResult<string>
        {
            Code = !isNeedReplicatings ? StatusCodes.Status200OK : StatusCodes.Status400BadRequest,
            Message = !isNeedReplicatings ? "新增成功！" : $"系统中存在重复的【{repString}】，不能重复添加！",
            Result = null,
            Type = !isNeedReplicatings ? "success" : "error",
            Extras = UnifyContext.Take(),
            Time = DateTime.Now
        };
    }

    /// <summary>
    /// 删除工程監工日誌打印
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "Delete")]
    public virtual async Task Delete(DeleteFlowSystemSGJKInput input)
    {
        var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
        await _rep.FakeDeleteAsync(entity);   //假删除
    }

    /// <summary>
    /// 更新工程監工日誌打印
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "Update")]
    public virtual async Task<JRResult<string>> Update(UpdateFlowSystemSGJKInput input)
    {
        var entity = input.Adapt<FlowSystemSGJK>();
        var doSomeResult = await entity.DoSomeThing(_rep.Context);
        if (!doSomeResult.Item1)
            return CustomeResult.Fail<string>(doSomeResult.Item2);
        bool isNeedReplicatings = false;
        string repString = null;
        Expression<Func<FlowSystemSGJK, bool>> whereExpression = r => r.Id != entity.Id;
        if (isNeedReplicatings)
        {
            isNeedReplicatings = await _rep.IsAnyAsync(whereExpression);
            if (!isNeedReplicatings)
            {
                await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
                await entity.DoSomeThingSaveChildren(_rep.Context);
            }
        }
        else
        {
            await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
            await entity.DoSomeThingSaveChildren(_rep.Context);
        }

        return new JRResult<string>
        {
            Code = !isNeedReplicatings ? StatusCodes.Status200OK : StatusCodes.Status400BadRequest,
            Message = !isNeedReplicatings ? "" : $"系统中存在重复的【{repString}】，不能修改！",
            Result = null,
            Type = !isNeedReplicatings ? "success" : "error",
            Extras = UnifyContext.Take(),
            Time = DateTime.Now
        };
    }

    /// <summary>
    /// 保存工程監工日誌打印
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "Save")]
    public virtual async Task<JRResult<string>> Save(UpdateFlowSystemSGJKInput input)
    {
        var entity = input.Adapt<FlowSystemSGJK>();
        await entity.SaveDoSomeThing(_rep.Context);
        bool isNeedReplicatings = false;
        string repString = null;
        Expression<Func<FlowSystemSGJK, bool>> whereExpression = r => r.Id != entity.Id;
        if (isNeedReplicatings)
        {
            isNeedReplicatings = await _rep.IsAnyAsync(whereExpression);
            if (!isNeedReplicatings)
            {
                await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
                await entity.DoSomeThingSaveChildren(_rep.Context);
            }
        }
        else
        {
            await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
            await entity.DoSomeThingSaveChildren(_rep.Context);
        }

        return new JRResult<string>
        {
            Code = !isNeedReplicatings ? StatusCodes.Status200OK : StatusCodes.Status400BadRequest,
            Message = !isNeedReplicatings ? "更新成功！" : $"系统中存在重复的【{repString}】，不能修改！",
            Result = null,
            Type = !isNeedReplicatings ? "success" : "error",
            Extras = UnifyContext.Take(),
            Time = DateTime.Now
        };
    }

    /// <summary>
    /// 保存工程監工日誌打印包含关联表
    /// </summary>
    /// <param name="entity"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "SaveWithChildren")]
    public virtual async Task<JRResult<string>> SaveWithChildren(FlowSystemSGJK entity)
    {
        await entity.SaveDoSomeThing(_rep.Context);
        bool isNeedReplicatings = false;
        string repString = null;
        Expression<Func<FlowSystemSGJK, bool>> whereExpression = r => r.Id != entity.Id;
        if (isNeedReplicatings)
        {
            isNeedReplicatings = await _rep.IsAnyAsync(whereExpression);
            if (!isNeedReplicatings)
            {
                await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
                await entity.DoSomeThingSaveChildren(_rep.Context);
            }
        }
        else
        {
            await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
            await entity.DoSomeThingSaveChildren(_rep.Context);
        }

        return new JRResult<string>
        {
            Code = !isNeedReplicatings ? StatusCodes.Status200OK : StatusCodes.Status400BadRequest,
            Message = !isNeedReplicatings ? "更新成功！" : $"系统中存在重复的【{repString}】，不能修改！",
            Result = null,
            Type = !isNeedReplicatings ? "success" : "error",
            Extras = UnifyContext.Take(),
            Time = DateTime.Now
        };
    }

    /// <summary>
    /// 获取工程監工日誌打印
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpGet]
    [ApiDescriptionSettings(Name = "Detail")]
    public virtual async Task<FlowSystemSGJK> Get([FromQuery] QueryByIdFlowSystemSGJKInput input)
    {
        var data = await _rep.GetFirstAsync(u => u.Id == input.Id);
        if (data != null)
        {
            data.Images = GetDocImg(data.Images);
        }
        return data;
    }

    /// <summary>
    /// 获取工程監工日誌打印详情
    /// </summary>
    [HttpGet]
    public virtual async Task<dynamic> Info(string tableName, long id)
    {
        var logConfigId = SqlSugarConst.GetDataBaseConfigId(tableName);
        if (logConfigId.IsNullOrEmpty())
            return new { };
        var _db = _rep.AsTenant().GetConnectionScope(logConfigId);
        var tableInfo = SqlSugarConst.GetDdataBaseFullName(tableName);
        var dt = await _db.SqlQueryable<dynamic>($"select * from {tableInfo} where Id={id}").ToListAsync();
        dynamic clay = Clay.Object(dt.FirstOrDefault());
        return TypeHelper.SetDynamicZh(SqlSugarConst.GetModelName(tableName), clay);
    }

    /// <summary>
    /// 获取工程監工日誌打印列表
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpGet]
    [ApiDescriptionSettings(Name = "List")]
    public async Task<List<FlowSystemSGJKOutput>> List([FromQuery] FlowSystemSGJKInput input)
    {
        return await _rep.AsQueryable().Select<FlowSystemSGJKOutput>().ToListAsync();
    }


    /// <summary>
    /// 上传照片
    /// </summary>
    /// <param name="file"></param>
    /// <returns></returns>
    [RequestSizeLimit(1024 * 1024 * 1000)]//设定请求大小为1GB（如需设置请求大小设置此特性）
    [ApiDescriptionSettings(Name = "UploadImages"), HttpPost]
    [AllowAnonymous]
    public virtual async Task<PropsHttpModel> UploadImages([Required] IFormFile file)
    {
        var service = App.GetService<SysFileService>();
        string todayString = DateTime.Today.ToString("yyyy-MM-dd");
        var model = await service.UploadFile(file, $"upload/JKImages/{todayString}");
        return new PropsHttpModel
        {
            fileId = model == null ? 0 : model.Id,
            url = model?.Url,
            name = model == null ? null : $"{model.Id}.{model.Suffix}",
            fileName = model?.FileName,
            home = model?.Url,
            res = "result"
        };
    }



    /// <summary>
    /// 导出工程監工日誌打印
    /// </summary>
    /// <returns></returns>
    [ApiDescriptionSettings(Name = "Export"), NonUnify]
    public virtual async Task<IActionResult> Export(FlowSystemSGJKInput input)
    {
        var context = _rep.AsQueryable().FilterDelete();
        if (context.UseCustomeSelectFlag())
        {
            var list = await context.CustomToSelectExport<FlowSystemSGJK, ExportImportFlowSystemSGJKDto>(input);
            IExcelExporter excelExporter = new ExcelExporter();
            var res = await excelExporter.ExportAsByteArray(list);
            return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "生产模式切换记录表.xlsx" };
        }
        else
        {

            var query = _rep.AsQueryable().FilterDelete().CustomWhere(input)
                .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u =>
                    u.project_name.Contains(input.SearchKey.Trim())
                    || u.supplier_name.Contains(input.SearchKey.Trim())
                    || u.personlist.Contains(input.SearchKey.Trim())
                )
                .WhereIF(!string.IsNullOrWhiteSpace(input.project_name), u => u.project_name.Contains(input.project_name.Trim()))
                .WhereIF(!string.IsNullOrWhiteSpace(input.supplier_name), u => u.supplier_name.Contains(input.supplier_name.Trim()))
                .WhereIF(!string.IsNullOrWhiteSpace(input.personlist), u => u.personlist.Contains(input.personlist.Trim()))
                .Select<ExportImportFlowSystemSGJKDto>()
    ;
            if (input.BeginDateTimeRange != null && input.BeginDateTimeRange.Count > 0)
            {
                DateTime? start = input.BeginDateTimeRange[0];
                query = query.WhereIF(start.HasValue, u => u.BeginDateTime > start);
                if (input.BeginDateTimeRange.Count > 1 && input.BeginDateTimeRange[1].HasValue)
                {
                    var end = input.BeginDateTimeRange[1].Value.AddDays(1);
                    query = query.Where(u => u.BeginDateTime < end);
                }
            }
            if (input.EndDateTimeRange != null && input.EndDateTimeRange.Count > 0)
            {
                DateTime? start = input.EndDateTimeRange[0];
                query = query.WhereIF(start.HasValue, u => u.EndDateTime > start);
                if (input.EndDateTimeRange.Count > 1 && input.EndDateTimeRange[1].HasValue)
                {
                    var end = input.EndDateTimeRange[1].Value.AddDays(1);
                    query = query.Where(u => u.EndDateTime < end);
                }
            }

            query = query.CustomeOrder(input, "");
            var list = await query.ToListAsync();
            IExcelExporter excelExporter = new ExcelExporter();
            var res = await excelExporter.ExportAsByteArray(list);
            return new FileStreamResult(new MemoryStream(res), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "工程監工日誌打印.xlsx" };
        }
    }

    /// <summary>
    /// 导入
    /// </summary>
    /// <param name="file"></param>
    /// <returns></returns>
    [HttpPost]
    public virtual async Task<JRResult<string>> Import(IFormFile file)
    {
        IImporter Importer = new ExcelImporter();
        var importData = await Importer.Import<ExportImportFlowSystemSGJKDto>(file.OpenReadStream());
        if (importData.HasError == true) { return CustomeResult.Fail<string>("导入错误"); }
        if (importData.Exception != null) { return CustomeResult.Fail<string>(importData.Exception.ToString()); }
        if (importData.RowErrors.Count > 0) { return CustomeResult.Fail<string>(JSON.Serialize(importData.RowErrors)); }
        if (importData.Data == null) { return CustomeResult.Fail<string>("导入的数据量不能为空！"); }
        if (importData.Data.Count <= 0) { return CustomeResult.Fail<string>("导入的数据量为0个！"); }

        var models = importData.Data.Adapt<List<FlowSystemSGJK>>();
        bool isNeedReplicatings = false;
        string repString = null;
        Expression<Func<FlowSystemSGJK, bool>> whereExpression = r => true;
        if (isNeedReplicatings)
        {
            isNeedReplicatings = await _rep.IsAnyAsync(whereExpression);

            if (!isNeedReplicatings)
            {
                await _rep.AsInsertable(models).ExecuteCommandAsync();
            }
            else
                return CustomeResult.Fail<string>(repString);
        }
        else
        {
            await _rep.AsInsertable(models).ExecuteCommandAsync();
        }

        return CustomeResult.SuccessNotShowMessage<string>();
    }


    /// <summary>
    /// 模板下载
    /// </summary>
    /// <returns></returns>
    [AllowAnonymous]
    [HttpGet]
    public virtual async Task<IActionResult> TemplateDown()
    {
        IImporter Importer = new ExcelImporter();
        var template = await Importer.GenerateTemplateBytes<ExportImportFlowSystemSGJKDto>();
        return new FileStreamResult(new MemoryStream(template), "application/octet-stream") { FileDownloadName = DateTime.Now.ToString("yyyyMMddHHmm") + "工程監工日誌打印导入模板.xlsx" };
    }
    #endregion
}

